package com.xm.design_patterns;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * 枚举单例
 * 优点：防反射、防序列化攻击、线程安全；
 * 缺点：不能继承（单例不需要考虑这个，故不能算是缺点）
 */
public class _021_EnumSingletonTest {
    public static void main(String[] args) {

        // Set集合用来保存创建的实例，Set集合可以自动去重，输出的结果中有2个或2个以上的对象，说明在并发访问的过程中出现了线程安全问题
        Set<String> instanceSet = Collections.synchronizedSet(new HashSet<>());
        // 创建10000个线程，将每个线程获得的实例添加到Set集合中，观察Set集合
        // 若是没出现，试着多运行几次或调大循环次数
        for (int i = 0; i < 10000; i++) {
            System.out.println(i);
            new Thread(() -> instanceSet.add(_021_EnumSingleton.INSTANCE.doSomething())).start();
        }
        // try {
        //     Thread.sleep(5000);
        // } catch (InterruptedException e) {
        //     throw new RuntimeException(e);
        // }
        System.out.println(instanceSet.size());
        System.out.println(instanceSet);

    }
}
